home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / src.arc / NRSUBR.C < prev    next >
C/C++ Source or Header  |  1989-08-12  |  3KB  |  146 lines

  1.  
  2. /* Functions for level 3 net/rom support */
  3. #include "global.h"
  4. #include "mbuf.h"
  5. #include "timer.h"
  6. #include "ax25.h"
  7. #include "netrom.h"
  8. #include "lapb.h"
  9. #include <ctype.h>
  10.  
  11. /* Convert a net/rom network header to host format structure
  12.  * Return -1 if error, 0 if OK
  13.  */
  14.  
  15. int
  16. ntohnr3(hdr,bpp)
  17. register struct nr3hdr *hdr ;    /* output structure */
  18. struct mbuf **bpp ;
  19. {
  20.     char buf[AXALEN] ;
  21.     char ttl ;
  22.     
  23.     if (pullup(bpp,buf,AXALEN) < AXALEN)
  24.         return -1 ;
  25.     getaxaddr(&hdr->source,buf) ;
  26.  
  27.     if (pullup(bpp,buf,AXALEN) < AXALEN)
  28.         return -1 ;
  29.     getaxaddr(&hdr->dest,buf) ;
  30.  
  31.     if (pullup(bpp,&ttl,1) != 1)
  32.         return -1 ;
  33.  
  34.     hdr->ttl = uchar(ttl) ;
  35.  
  36.     return 0 ;
  37. }
  38.  
  39. /* Convert a host-format net/rom level 3 header into an mbuf ready
  40.  * for transmission.
  41.  */
  42.  
  43. struct mbuf *
  44. htonnr3(hdr)
  45. register struct nr3hdr *hdr;
  46. {
  47.     struct mbuf *rbuf ;
  48.     register char *cp ;
  49.  
  50.     if (hdr == (struct nr3hdr *) NULL)
  51.         return NULLBUF ;
  52.  
  53.     /* Allocate space for return buffer */
  54.     if ((rbuf = alloc_mbuf(NR3HLEN)) == NULLBUF)
  55.         return NULLBUF ;
  56.  
  57.     rbuf->cnt = NR3HLEN ;
  58.  
  59.     /* Now convert */
  60.     cp = rbuf->data ;
  61.  
  62.     hdr->source.ssid &= ~E ;    /* source E-bit is always off */
  63.     hdr->dest.ssid |= E ;        /* destination E-bit always set */
  64.  
  65.     cp = putaxaddr(cp,&hdr->source) ;
  66.     cp = putaxaddr(cp,&hdr->dest) ;
  67.     *cp = hdr->ttl ;
  68.  
  69.     return rbuf ;
  70. }
  71.  
  72. /* Convert a net/rom routing broadcast destination subpacket from
  73.  * network format to a host format structure.  Return -1 if error,
  74.  * 0 if OK.
  75.  */
  76. int ntohnrdest(ds,bpp)
  77. register struct nr3dest *ds ;
  78. struct mbuf **bpp ;
  79. {
  80.     char buf[AXALEN] ;
  81.     char quality ;
  82.  
  83.     /* get destination callsign */
  84.     if (pullup(bpp,buf,AXALEN) < AXALEN)
  85.         return -1 ;
  86.     memcpy(ds->dest.call,buf,ALEN) ;
  87.     ds->dest.ssid = buf[ALEN] ;
  88.  
  89.     /* get destination alias */
  90.     if (pullup(bpp,ds->alias,ALEN) < ALEN)
  91.         return -1 ;
  92.     ds->alias[ALEN] = '\0' ;
  93.  
  94.     /* get best neighbor callsign */
  95.     if (pullup(bpp,buf,AXALEN) < AXALEN)
  96.         return -1 ;
  97.     memcpy(ds->neighbor.call,buf,ALEN) ;
  98.     ds->neighbor.ssid = buf[ALEN] ;
  99.  
  100.     /* get route quality */
  101.     if (pullup(bpp,&quality,1) < 1)
  102.         return -1 ;
  103.     ds->quality = uchar(quality) ;
  104.  
  105.     return 0 ;
  106. }
  107.  
  108. /* Convert a host-format net/rom destination subpacket into an
  109.  * mbuf ready for transmission as part of a route broadcast
  110.  * packet.
  111.  */
  112. struct mbuf *
  113. htonnrdest(ds)
  114. register struct nr3dest *ds ;
  115. {
  116.     struct mbuf *rbuf ;
  117.     register char *cp ;
  118.  
  119.     if (ds == (struct nr3dest *) NULL)
  120.         return NULLBUF ;
  121.  
  122.     /* Allocate space for return buffer */
  123.     if ((rbuf = alloc_mbuf(NRRTDESTLEN)) == NULLBUF)
  124.         return NULLBUF ;
  125.  
  126.     rbuf->cnt = NRRTDESTLEN ;
  127.  
  128.     cp = rbuf->data ;
  129.  
  130.     memcpy(cp,ds->dest.call,ALEN) ;
  131.     cp += ALEN ;
  132.     *cp++ = ds->dest.ssid ;
  133.  
  134.     memcpy(cp,ds->alias,ALEN) ;
  135.     cp += ALEN ;
  136.  
  137.     memcpy(cp,ds->neighbor.call,ALEN) ;
  138.     cp += ALEN ;
  139.     *cp++ = ds->neighbor.ssid ;
  140.  
  141.     *cp = uchar(ds->quality) ;
  142.  
  143.     return rbuf ;
  144. }
  145.  
  146.